package com.fjwt.gz.core.utils;

import com.alibaba.fastjson2.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.fjwt.gz.core.exception.BizException;
import com.fjwt.gz.core.model.SmsConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

@Slf4j
public class AliyunSMSKit {

    public static final boolean send(SmsConfig smsConfig, String templateId, String phone, JSONObject templateVal){

        try {

            if (smsConfig == null || StringUtils.isEmpty(templateId)) {
                return false;
            }
            log.info("读取短信配置：短信签名：{}", smsConfig.getSignName());

            //可自助调整超时时间
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");

            //初始化acsClient,暂不支持region化
            IClientProfile profile = DefaultProfile.getProfile(SmsConfig.regionId, smsConfig.getAccessKeyId(), smsConfig.getAccessKeySecret());
            DefaultProfile.addEndpoint(SmsConfig.endpointName, SmsConfig.regionId, SmsConfig.product, SmsConfig.domain);
            IAcsClient acsClient = new DefaultAcsClient(profile);

            //组装请求对象-具体描述见控制台-文档部分内容
            SendSmsRequest request = new SendSmsRequest();
            //必填:待发送手机号
            request.setPhoneNumbers(phone);
            //必填:短信签名-可在短信控制台中找到
            request.setSignName(smsConfig.getSignName());
            //必填:短信模板-可在短信控制台中找到
            request.setTemplateCode(templateId);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            request.setTemplateParam(templateVal.toJSONString());

            //hint 此处可能会抛出异常，注意catch
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);

            log.info("调用阿里短信服务完成.phone={},code={},message={},requestId={},bizId={}", phone,
                    sendSmsResponse.getCode(), sendSmsResponse.getMessage(), sendSmsResponse.getRequestId(), sendSmsResponse.getBizId());

            String code=sendSmsResponse.getCode();
            if(!StringUtils.isEmpty(code)&&code.equals("OK")){
                return true;
            }else {
               String msg= sendSmsResponse.getMessage();
                throw new BizException(StringUtils.isEmpty(msg)?"短信发送失败":msg);
            }
        } catch (Exception e) {
            log.info("短信异常：", e);
            throw new BizException("短信发送失败");
        }
    }

}
